var LaySelect = (function() {
	var s_options = {};
	var $;
	var form;

	function select(_options) {
		_options.successBack = _options.successBack;
		_options.where = _options.where || {}; //固定请求参数 一般只有一个参数 编译替换值而已 多个属性时默认替换第一个参数的值  
		_options.type = _options.type || 'get'; //默认get
		_options.url = _options.url;
		_options.async = typeof(_options.async) == "boolean" ? _options.async : true; //是否异步？
		_options.contentType = (_options.contentType == null || _options.contentType == "" || typeof(_options.contentType) ==
			"undefined") ? 'application/x-www-form-urlencoded' : _options.contentType;
		_options.elems = _options.elems || [];
		_options.layFilters = _options.layFilters || [];
		_options.request = _options.request || {}; //默认请求参数
		_options.data = Object.assign({}, _options.request, _options.where); //请求数据
		_options.parseData = typeof(_options.parseData) === 'function' ? _options.parseData : parseData;
		_options.otherOption=(_options.otherOption&&_options.otherOption!=false)?"<option value=''>全部</option>":"";
		s_options = _options;
       

		layui.use(['form', 'jquery'], function() {
			$ = layui.jquery;
			form = layui.form;
			getRequestData(0,true);

			//选择事件
			for (var i = 0; i < s_options.layFilters.length; i++) {
				form.on('select(' + s_options.layFilters[i] + ')', function(data) {	
					//回调
					if (typeof(s_options.change) === 'function') {
						var _continue= s_options.change(data, form);
						if(_continue){
							return true;
						}
					}
					//多级联动 需要设置为true
					if (!s_options.linkage) {									
						return false;
					} else {
						var ind = getInd(data.elem); //当前联动的级别
						if (data.value && ind != -1) {
							var cj = 0;
							for (var key in s_options.where) {
								if (cj == 0) {
									s_options.where[key] = data.value;
								}
								cj++;
							}
							s_options.data = $.extend(s_options.data, s_options.where); //请求数据
							getRequestData(ind + 1, false); //操作的是下一个节点
						} else {
							clearSubNode(ind + 1); //清除所有子节点 信息
							form.render("select");
						}
					}
			
				});
			}

		});

	}



	//构建下拉框
	function buildSelect(data, ind, elems,isInit) {
		var conOptions = s_options.otherOption;
		var defaultValues = s_options.defaultValues || [];
		var currentValue = defaultValues[ind];
		var keyValues = s_options.keyValues;
		var keyValue;
		var extraValue; //额外存储到option的data-info上的字段值
		
		//是否联动 默认为false --- 常规的下拉框 非联动
		if (!s_options.linkage) {
			var layFilters = s_options.layFilters,
				listArr;
			if (!data) {
				throw new Error("返回的数据格式不正确,参考文档:\r\n http://yli17.cn/hK2ut");
			}
			for (var i = 0; i < elems.length; i++) {
				listArr = data[layFilters[i]];
				currentValue = defaultValues[i];
				keyValue = keyValues[i] || keyValues[0]; //默认取第一个
		
				if (listArr) {
					conOptions = s_options.otherOption;
					for (var k = 0; k < listArr.length; k++) {
						extraValue = listArr[k][keyValue.extra] || '';
						if (currentValue === listArr[k][keyValue.value] && isInit) {
							conOptions += '<option value="' + listArr[k][keyValue.value] + '" data-info="' + extraValue + '"   selected >' +
								listArr[k][keyValue.key] + '</option>';
						} else {
							conOptions += '<option value="' + listArr[k][keyValue.value] + '" data-info="' + extraValue + '">' + listArr[k]
								[keyValue.key] + '</option>';
						}
		
					}
					console.log(conOptions);
					$(elems[i]).html(conOptions);
				}
			}
			form.render("select");
		
		} //多级联动
		else if (data && data[0] && data[0].subTree) {
		
			var arrTree = data[0].subTree;
			var lastData = null;
			for (var i = 0; i < arrTree.length; i++) {
				keyValue = keyValues[i] || keyValues[0]; //默认取第一个
				extraValue = arrTree[i][keyValue.extra] || '';
				if (currentValue === arrTree[i][keyValue.value] && isInit) {
					conOptions += '<option value="' + arrTree[i][keyValue.value] + '" data-info="' + extraValue + '"  selected>' +
						arrTree[i][keyValue.key] + '</option>';
					var cj = 0;
					for (var key in s_options.where) {
						if (cj == 0) {
							s_options.where[key] = currentValue;
						}
						cj++;
					}
		
					s_options.data = $.extend(s_options.data, s_options.where); //请求数据
					getRequestData(ind + 1, isInit); //操作的是下一个节点					
		
				} else {
					conOptions += '<option value="' + arrTree[i][keyValue.value] + '"  data-info="' + extraValue + '" >' + arrTree[i]
						[keyValue.key] + '</option>';
				}
			}
			$(elems[ind]).html(conOptions);
			clearSubNode(ind + 1); //清除所有子节点 信息
			form.render("select");
		} else {
			clearSubNode(ind); //没找到 下级 清除操作的下级 及子节点信息
			form.render("select");
		}
	}


	//获取选择器的下标 即联动的层级
	function getInd(selector) {
		var ind = -1;
		var elems = s_options.elems;
		for (var i = 0; i < elems.length; i++) {
			if (elems[i] === '#' + $(selector).attr("id")) {
				ind = i;
			}
		}
		this.curInd = ind;
		return ind;
	}

	//清除子节点信息
	function clearSubNode(ind) {
		var elems = s_options.elems;
		for (var i = ind; i < elems.length; i++) {
			$(elems[i]).html('');
		}
	}


	function getRequestData(ind,isInit) {
		ind = ind || 0; //默认为1
		var res = {
			success: true
		};
		// url为空 但数据源存在
		if (!s_options.url) {
			if (!s_options.jsonData) {
				return;
			}
			if (typeof(s_options.successBack) === 'function') {
				s_options.successBack(s_options.jsonData, form);
				return;
			}
		
			if (s_options.parseData) {
				res = s_options.parseData(s_options.jsonData);
			} else {
				$.extend(res, s_options.jsonData);
			}
		
			//执行成功了
			if (res.success) {
				buildSelect(res.data, ind, s_options.elems, isInit); //构建select	
			}
			return;
		}
		
		// 这部分可以根据业务定义参数 或者 换成你项目封装的ajax
		$.ajax({
			type: s_options.type,
			async: s_options.async,
			url: s_options.url,
			data: s_options.data,
			contentType: s_options.contentType,
			/* headers: {
				
			}, */
			/* xhrFields: {
				withCredentials: true //支持cors跨域名请求
			}, */
			success: function(res) {
				//定义了成功的回调就直接自定义方法 不走内部的构建select方法
				if (typeof(s_options.successBack) === 'function') {
					s_options.successBack(res, form);
					return;
				}
		
				if (s_options.parseData) {
					res = s_options.parseData(res);
				} else {
					$.extend(res, res);
				}		
				//执行成功了
				if (res.success) {
					buildSelect(res.data, ind, s_options.elems, isInit); //构建select	
				}
		
			},
			error: function(data) {
				if (typeof(s_options.errorBack) === 'function') {
					s_options.errorBack(data);
				}
				console.log("发生错误:" + data);
			}
		})
	}

	//默认的解析数据方法
	function parseData(res) {
		//需要解析的格式
		return {
			code: res.code,
			success: res.success,
			msg: res.msg,
			data: res.resultValue
		}
	}

	//对象方法  [我的理解]
	return function() {
		this.select = select
	}
})();






//属性使您有能力向对象添加属性和方法
LaySelect.prototype = {

}
